import os
from dotenv import load_dotenv
from aiogram import Bot, Router, F
from aiogram.types import Message, CallbackQuery, FSInputFile
from aiogram.filters import Command, CommandStart, or_f
from funcs.shazam import shazmit
from funcs.ai import aig
from funcs.downtrack import searchsong, rundown 
from app import keyboard as kb

load_dotenv()
TGT = os.getenv('TG_TOKEN')
bot = Bot(token=TGT)
rtr = Router()


@rtr.message(or_f(CommandStart(), F.text == 'Старт'))
async def cmd_start(message: Message):
    await message.answer('Привет мой друг! Что будем делать?', reply_markup=kb.main)

@rtr.message(or_f(Command('help'), F.text == 'О боте'))
async def cmd_help(message: Message):
    await message.reply(
            "Это очень удобный бот с различными функциями, которых со временем будет все больше и больше.\nПеречень этих функций:\n/help или в чат 'О боте'--данное сообщение.\n/donates или в чат 'Помощь'--данная функция будет реализованна позже.\n/shazam или в чат 'Шазам(Pyzam)'--данная функция предназначенна для угадывания песни, она использует библиотеку pyzam.\n/ai или в чат 'Диалог с ИИ'--данная функция начинает диалог с gpt3.5-turbo из duckduckgo ai chat.\n/exai или в чат 'Закончить диалог'--данная функция заканчивает диалог с ИИ.")

@rtr.message(or_f(Command('donates'), F.text == 'Помощь'))
async def cmd_donates(message: Message):
    await message.reply('По этой команде можно будет делать донаты')

@rtr.message(or_f(Command('shazam'), F.text == 'Шазам(Pyzam)'))
async def shazam(message : Message):
    await message.answer('Запишите голосовое сообщение или скиньте аудиофайл')

@rtr.message(or_f(F.voice, F.audio))
async def shazamin(message : Message):
    global nameforsearch, urli, downmessage
    try:
        if message.voice:
            file_id = message.voice.file_id
        elif message.audio:
            file_id = message.audio.file_id
        else:
            await message.answer('Пришлите аудиофайл или голосовое сообщение!')
        file = await bot.get_file(file_id)
        file_path = file.file_path
        file_name = f'/tmp/audio{file_id}.mp3'
        await bot.download_file(file_path, file_name)
        uri, name, artist = await shazmit(file_name)
        nameforsearch = f"{artist.title()}-{name.title()}"
        urli = await searchsong(song=nameforsearch) 
        if urli:
            textsnd = f'<b>Название песни:</b>\n<i>{name}</i>\n<b>Исполнитель</b>\n<i>{artist}</i>\n<b>Ссылка на ютуб</b>\n<i>{urli}</i>'
        else:
            textsnd = f'<b>Название песни:</b>\n<i>{name}</i>\n<b>Исполнитель</b>\n<i>{artist}</i>'
        await bot.send_photo(chat_id=message.chat.id, photo=uri, caption=textsnd, parse_mode='html')
        os.system('rm /tmp/audio*.mp3')
        if urli != '':
           downmessage = await message.answer('Вы можете скачать эту песню нажав', reply_markup=kb.downtrack)
    except Exception as ex:
        print(ex)
        await bot.send_message(chat_id=message.chat.id, text='Ошибка! Попробуйте другой файл')

@rtr.callback_query(F.data == 'down-track')
async def download(callback: CallbackQuery):
    global nameforsearch, urli, downmessage
    await bot.delete_message(chat_id=downmessage.chat.id, message_id=downmessage.message_id)
    ttt = await callback.message.answer('Подождите идет скачивание...')
    if await rundown(url=urli, path=f'/tmp/{nameforsearch}_ytau'):
        await bot.delete_message(chat_id=ttt.chat.id, message_id=ttt.message_id)
        await bot.send_audio(callback.message.chat.id, FSInputFile(f'/tmp/{nameforsearch}_ytau.mp3'))
        os.system('rm /tmp/*_ytau.mp3')
    

@rtr.message(or_f(Command('ai'), F.text == 'Диалог с ИИ'))
async def start_dialogue(message: Message):
    global dialogue_active
    dialogue_active = True
    await message.reply('О чём бы вы хотели поговорить? Напишите свой вопрос в чат.', reply_markup=kb.exdialog)

@rtr.message(or_f(Command('exai'), F.text == 'Закончить диалог'))
async def stop_dialogue(message: Message):
    global dialogue_active
    dialogue_active = False
    await message.answer('Диалог с ИИ прекращен.', reply_markup=kb.main)

@rtr.message(F.text)
async def generate(message: Message):
    if dialogue_active:
        genmsg = await message.answer("Колдую над ответом 🪄")
        response = await aig(message.text)
        await bot.delete_message(chat_id=genmsg.chat.id, message_id=genmsg.message_id)
        await message.reply(response)

